<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
    "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<meta name="generator" content="AsciiDoc 8.2.2" />
<style type="text/css">
/* Debug borders */
p, li, dt, dd, div, pre, h1, h2, h3, h4, h5, h6 {
/*
  border: 1px solid red;
*/
}

body {
  margin: 1em 5% 1em 5%;
}

a {
  color: blue;
  text-decoration: underline;
}
a:visited {
  color: fuchsia;
}

em {
  font-style: italic;
}

strong {
  font-weight: bold;
}

tt {
  color: navy;
}

h1, h2, h3, h4, h5, h6 {
  color: #527bbd;
  font-family: sans-serif;
  margin-top: 1.2em;
  margin-bottom: 0.5em;
  line-height: 1.3;
}

h1 {
  border-bottom: 2px solid silver;
}
h2 {
  border-bottom: 2px solid silver;
  padding-top: 0.5em;
}

div.sectionbody {
  font-family: serif;
  margin-left: 0;
}

hr {
  border: 1px solid silver;
}

p {
  margin-top: 0.5em;
  margin-bottom: 0.5em;
}

pre {
  padding: 0;
  margin: 0;
}

span#author {
  color: #527bbd;
  font-family: sans-serif;
  font-weight: bold;
  font-size: 1.1em;
}
span#email {
}
span#revision {
  font-family: sans-serif;
}

div#footer {
  font-family: sans-serif;
  font-size: small;
  border-top: 2px solid silver;
  padding-top: 0.5em;
  margin-top: 4.0em;
}
div#footer-text {
  float: left;
  padding-bottom: 0.5em;
}
div#footer-badges {
  float: right;
  padding-bottom: 0.5em;
}

div#preamble,
div.tableblock, div.imageblock, div.exampleblock, div.verseblock,
div.quoteblock, div.literalblock, div.listingblock, div.sidebarblock,
div.admonitionblock {
  margin-right: 10%;
  margin-top: 1.5em;
  margin-bottom: 1.5em;
}
div.admonitionblock {
  margin-top: 2.5em;
  margin-bottom: 2.5em;
}

div.content { /* Block element content. */
  padding: 0;
}

/* Block element titles. */
div.title, caption.title {
  font-family: sans-serif;
  font-weight: bold;
  text-align: left;
  margin-top: 1.0em;
  margin-bottom: 0.5em;
}
div.title + * {
  margin-top: 0;
}

td div.title:first-child {
  margin-top: 0.0em;
}
div.content div.title:first-child {
  margin-top: 0.0em;
}
div.content + div.title {
  margin-top: 0.0em;
}

div.sidebarblock > div.content {
  background: #ffffee;
  border: 1px solid silver;
  padding: 0.5em;
}

div.listingblock {
  margin-right: 0%;
}
div.listingblock > div.content {
  border: 1px solid silver;
  background: #f4f4f4;
  padding: 0.5em;
}

div.quoteblock > div.content {
  padding-left: 2.0em;
}

div.attribution {
  text-align: right;
}
div.verseblock + div.attribution {
  text-align: left;
}

div.admonitionblock .icon {
  vertical-align: top;
  font-size: 1.1em;
  font-weight: bold;
  text-decoration: underline;
  color: #527bbd;
  padding-right: 0.5em;
}
div.admonitionblock td.content {
  padding-left: 0.5em;
  border-left: 2px solid silver;
}

div.exampleblock > div.content {
  border-left: 2px solid silver;
  padding: 0.5em;
}

div.verseblock div.content {
  white-space: pre;
}

div.imageblock div.content { padding-left: 0; }
div.imageblock img { border: 1px solid silver; }
span.image img { border-style: none; }

dl {
  margin-top: 0.8em;
  margin-bottom: 0.8em;
}
dt {
  margin-top: 0.5em;
  margin-bottom: 0;
  font-style: italic;
}
dd > *:first-child {
  margin-top: 0;
}

ul, ol {
    list-style-position: outside;
}
ol.olist2 {
  list-style-type: lower-alpha;
}

div.tableblock > table {
  border: 3px solid #527bbd;
}
thead {
  font-family: sans-serif;
  font-weight: bold;
}
tfoot {
  font-weight: bold;
}

div.hlist {
  margin-top: 0.8em;
  margin-bottom: 0.8em;
}
div.hlist td {
  padding-bottom: 5px;
}
td.hlist1 {
  vertical-align: top;
  font-style: italic;
  padding-right: 0.8em;
}
td.hlist2 {
  vertical-align: top;
}

@media print {
  div#footer-badges { display: none; }
}

div#toctitle {
  color: #527bbd;
  font-family: sans-serif;
  font-size: 1.1em;
  font-weight: bold;
  margin-top: 1.0em;
  margin-bottom: 0.1em;
}

div.toclevel1, div.toclevel2, div.toclevel3, div.toclevel4 {
  margin-top: 0;
  margin-bottom: 0;
}
div.toclevel2 {
  margin-left: 2em;
  font-size: 0.9em;
}
div.toclevel3 {
  margin-left: 4em;
  font-size: 0.9em;
}
div.toclevel4 {
  margin-left: 6em;
  font-size: 0.9em;
}
/* Workarounds for IE6's broken and incomplete CSS2. */

div.sidebar-content {
  background: #ffffee;
  border: 1px solid silver;
  padding: 0.5em;
}
div.sidebar-title, div.image-title {
  font-family: sans-serif;
  font-weight: bold;
  margin-top: 0.0em;
  margin-bottom: 0.5em;
}

div.listingblock div.content {
  border: 1px solid silver;
  background: #f4f4f4;
  padding: 0.5em;
}

div.quoteblock-content {
  padding-left: 2.0em;
}

div.exampleblock-content {
  border-left: 2px solid silver;
  padding-left: 0.5em;
}

/* IE6 sets dynamically generated links as visited. */
div#toc a:visited { color: blue; }
</style>
<script type="text/javascript">
/*<![CDATA[*/
window.onload = function(){generateToc(2)}
/* Author: Mihai Bazon, September 2002
 * http://students.infoiasi.ro/~mishoo
 *
 * Table Of Content generator
 * Version: 0.4.sp
 *
 * Feel free to use this script under the terms of the GNU General Public
 * License, as long as you do not remove or alter this notice.
 */

 /* modified by Troy D. Hanson, September 2006. License: GPL */
 /* modified by Stuart Rackham, October 2006. License: GPL */
 /* modified by Shawn Pearce, August 2009. License: GPL */

function getText(el) {
  var text = "";
  for (var i = el.firstChild; i != null; i = i.nextSibling) {
    if (i.nodeType == 3 /* Node.TEXT_NODE */) // IE doesn't speak constants.
      text += i.data;
    else if (i.firstChild != null)
      text += getText(i);
  }
  return text;
}

function TocEntry(el, text, toclevel) {
  this.element = el;
  this.text = text;
  this.toclevel = toclevel;
  this.assigned = false;

  if (el.id != '') {
    this.id = el.id;

  } else {
    var a = el.firstChild;
    if ((a.tagName == "a" || a.tagName == "A") && a.id != "") {
      this.id = a.id;
    } else {
      this.id = '';
    }
  }
}

function tocEntries(el, toclevels) {
  var result = new Array;
  var re = new RegExp('[hH]([2-'+(toclevels+1)+'])');
  // Function that scans the DOM tree for header elements (the DOM2
  // nodeIterator API would be a better technique but not supported by all
  // browsers).
  var iterate = function (el) {
    for (var i = el.firstChild; i != null; i = i.nextSibling) {
      if (i.nodeType == 1 /* Node.ELEMENT_NODE */) {
        var mo = re.exec(i.tagName)
        if (mo)
          result[result.length] = new TocEntry(i, getText(i), mo[1]-1);
        iterate(i);
      }
    }
  }
  iterate(el);
  return result;
}

// This function does the work. toclevels = 1..4.
function generateToc(toclevels) {
  var simple_re = new RegExp('^[a-zA-Z._ -]{1,}$');
  var entries = tocEntries(document.getElementsByTagName("body")[0], toclevels);
  var usedIds = new Array();

  for (var i = 0; i < entries.length; ++i) {
    var entry = entries[i];
    if (entry.id != "")
      usedIds[entry.id] = entry;
  }

  for (var i = 0; i < entries.length; ++i) {
    var entry = entries[i];
    if (entry.id != "" || !simple_re.exec(entry.text))
      continue;

    var n = entry.text.replace(/ /g, '_').toLowerCase();
    var e = usedIds[n];
    if (e) {
      if (e.assigned)
        e.id = '';
      continue;
    }

    entry.assigned = true;
    entry.id = n;
    entry.element.id = entry.id;
    usedIds[n] = entry;
  }

  for (var i = 0; i < entries.length; ++i) {
    var entry = entries[i];
    if (entry.id == '') {
      entry.id = "toc" + i;
      entry.element.id = entry.id;
    }
  }

  var toc = document.getElementById("toc");
  for (var i = 0; i < entries.length; ++i) {
    var entry = entries[i];
    var a = document.createElement("a");
    a.href = "#" + entry.id;
    a.appendChild(document.createTextNode(entry.text));
    var div = document.createElement("div");
    div.appendChild(a);
    div.className = "toclevel" + entry.toclevel;
    toc.appendChild(div);
  }
}
/*]]>*/
</script>
<title>Gerrit Code Review - Installation Guide</title>
</head>
<body>
<div id="header">
<h1>Gerrit Code Review - Installation Guide</h1>
<span id="revision">version v2.1.1.1</span>
<div id="toc">
  <div id="toctitle">Table of Contents</div>
  <noscript><p><b>JavaScript must be enabled in your browser to display the table of contents.</b></p></noscript>
</div>
</div>
<div id="preamble">
<div class="sectionbody">
<p>You need a SQL database to house the review metadata.  Currently H2,
MySQL and PostgreSQL are the only supported databases.</p>
</div>
</div>
<h2><a id="download"></a>Download Gerrit</h2>
<div class="sectionbody">
<p>Current and past binary releases of Gerrit can be obtained from
the downloads page at the project site:</p>
<ul>
<li>
<p>
<a href="http://code.google.com/p/gerrit/downloads/list">Gerrit Downloads</a>
</p>
</li>
</ul>
<p>Download any current <tt>*.war</tt> package. The war will be referred to as
<tt>gerrit.war</tt> from this point forward, so you may find it easier to
rename the downloaded file.</p>
<p>If you would prefer to build Gerrit directly from source, review
the notes under <a href="dev-readme.html">developer setup</a>.</p>
</div>
<h2><a id="createdb"></a>Database Setup</h2>
<div class="sectionbody">
<h3><a id="createdb_h2"></a>H2</h3>
<p>During init Gerrit will automatically configure the embedded H2
database.  No additional configuration is necessary.  Using the
embedded H2 database is the easiest way to get a Gerrit site up
and running.</p>
<h3><a id="createdb_postgres"></a>PostgreSQL</h3>
<p>Create a user for the web application within Postgres, assign it a
password, create a database to store the metadata, and grant the user
full rights on the newly created database:</p>
<div class="listingblock">
<div class="content">
<pre><tt>  createuser -A -D -P -E gerrit2
  createdb -E UTF-8 -O gerrit2 reviewdb</tt></pre>
</div></div>
<h3><a id="createdb_mysql"></a>MySQL</h3>
<p>Create a user for the web application within the database, assign it a
password, create a database, and give the newly created user full
rights on it:</p>
<div class="listingblock">
<div class="content">
<pre><tt>  mysql

  CREATE USER 'gerrit2'@'localhost' IDENTIFIED BY 'secret';
  CREATE DATABASE reviewdb;
  ALTER DATABASE reviewdb charset=latin1;
  GRANT ALL ON reviewdb.* TO 'gerrit2'@'localhost';
  FLUSH PRIVILEGES;</tt></pre>
</div></div>
</div>
<h2><a id="init"></a>Initialize the Site</h2>
<div class="sectionbody">
<p>Gerrit stores configuration files, the server's SSH keys, and the
managed Git repositories under a local directory, typically referred
to as <tt><em>$site_path</em></tt>.  If the embedded H2 database is being used,
its data files will also be stored under this directory.</p>
<p>Initialize a new site directory by running the init command, passing
the path of the site directory to be created as an argument to the
<em>-d</em> option.  Its recommended that Gerrit Code Review be given its
own user account on the host system:</p>
<div class="listingblock">
<div class="content">
<pre><tt>  sudo adduser gerrit2
  sudo su gerrit2
  cd ~gerrit2

  java -jar gerrit.war init -d review_site</tt></pre>
</div></div>
<p>If run from an interactive terminal, <em>init</em> will prompt through a
series of configuration questions, including gathering information
about the database created above.  If the terminal is not interactive
init will make some reasonable default selections, and will use the
embedded H2 database.</p>
<p>Init may need to download additional JARs to support optional selected
functionality.  If a download fails a URL will be displayed and init
will wait for the user to manually download the JAR and store it in
the target location.</p>
<p>When <em>init</em> is complete, the daemon will be automatically started
in the background and your web browser will open to the site:</p>
<div class="listingblock">
<div class="content">
<pre><tt>  Initialized /home/gerrit2/review_site
  Executing /home/gerrit2/review_site/bin/gerrit.sh start
  Starting Gerrit Code Review: OK
  Waiting for server to start ... OK
  Opening browser ...</tt></pre>
</div></div>
<p>When the browser opens, sign in to Gerrit through the web interface.
The first user to sign-in and register an account will be
automatically placed into the fully privileged Administrators group,
permitting server management over the web and over SSH.  Subsequent
users will be automatically registered as unprivileged users.</p>
</div>
<h2><a id="project_setup"></a>Project Setup</h2>
<div class="sectionbody">
<p>See <a href="project-setup.html">Project Setup</a> for further details on
how to register a new project with Gerrit.  This step is necessary
if existing Git repositories were not imported during <em>init</em>.</p>
</div>
<h2>Start/Stop Daemon</h2>
<div class="sectionbody">
<p>To control the Gerrit Code Review daemon that is running in the
background, use the rc.d style start script created by <em>init</em>:</p>
<div class="exampleblock">
<div class="exampleblock-content">
<div class="literalblock">
<div class="content">
<pre><tt>review_site/bin/gerrit.sh start
review_site/bin/gerrit.sh stop
review_site/bin/gerrit.sh restart</tt></pre>
</div></div>
</div></div>
<p>(<em>Optional</em>) Link the gerrit.sh script into rc3.d so the daemon
automatically starts and stops with the operating system:</p>
<div class="exampleblock">
<div class="exampleblock-content">
<div class="literalblock">
<div class="content">
<pre><tt>sudo ln -snf `pwd`/review_site/bin/gerrit.sh /etc/init.d/gerrit.sh
sudo ln -snf ../init.d/gerrit.sh /etc/rc3.d/S90gerrit</tt></pre>
</div></div>
</div></div>
<p>To install Gerrit into an existing servlet container instead of using
the embedded Jetty server, see
<a href="install-j2ee.html">J2EE installation</a>.</p>
</div>
<h2><a id="customize"></a>Site Customization</h2>
<div class="sectionbody">
<p>Gerrit Code Review supports some site-specific customization options.
For more information, see the related topic in this manual:</p>
<ul>
<li>
<p>
<a href="config-apache2.html">Apache 2 Reverse Proxy</a>
</p>
</li>
<li>
<p>
<a href="config-sso.html">Single Sign-On Systems</a>
</p>
</li>
<li>
<p>
<a href="config-replication.html">Git Replication/Mirroring</a>
</p>
</li>
<li>
<p>
<a href="config-headerfooter.html">Site Header/Footer</a>
</p>
</li>
<li>
<p>
<a href="config-gitweb.html">Gitweb Integration</a>
</p>
</li>
<li>
<p>
<a href="config-gerrit.html">Other System Settings</a>
</p>
</li>
</ul>
</div>
<h2><a id="anonymous_access"></a>Anonymous Access</h2>
<div class="sectionbody">
<p>Exporting the Git repository directory
(<a href="config-gerrit.html#gerrit.basePath">gerrit.basePath</a>) over the
anonymous, unencrypted git:// protocol is more efficient than
Gerrit's internal SSH daemon.  See the <tt>git-daemon</tt> documentation
for details on how to configure this if anonymous access is desired.</p>
<ul>
<li>
<p>
<a href="http://www.kernel.org/pub/software/scm/git/docs/git-daemon.html">man git-daemon</a>
</p>
</li>
</ul>
</div>
<h2>External Documentation Links</h2>
<div class="sectionbody">
<ul>
<li>
<p>
<a href="http://www.postgresql.org/docs/">PostgreSQL Documentation</a>
</p>
</li>
<li>
<p>
<a href="http://dev.mysql.com/doc/">MySQL Documentation</a>
</p>
</li>
<li>
<p>
<a href="http://www.kernel.org/pub/software/scm/git/docs/git-daemon.html">git-daemon</a>
</p>
</li>
</ul>
</div>
<hr style="
  height: 2px;
  color: silver;
  margin-top: 1.2em;
  margin-bottom: 0.5em;
">
<p>Part of <a href="index.html">Gerrit Code Review</a></p>
<div id="footer">
<div id="footer-text">
Version v2.1.1.1<br />
Last updated 11-Jan-2010 08:57:22 PDT
</div>
</div>
</body>
</html>
